/*
 * \file Memoizer.h
 *
 * \author Thibaut ALGRIN
 * \author Emmanuel CARRE
 *
 * \version 1.0
 * \date 14 déc. 2011
 */

#ifndef MEMOIZER_H_
#define MEMOIZER_H_

#include "EnsembleCouples.h"

namespace tp3
{

	template<typename TypeArgument, typename TypeResultat, typename TypeMemoireCache>
	/*
	 * \class Memoizer
	 * \brief Classe permettant de stocker des résultats pour les réutiliser
	 * \fn Memoizer<TypeArgument, TypeResultat, TypeMemoireCache>
	 */
	class Memoizer
	{
	public:
		/*
		 * \brief Constructeur de la classe
		 * \fn Memoizer(TypeResultat (*fonction)( TypeArgument ), unsigned int taille_maximale_element_cache = 100);
		 */
		Memoizer(TypeResultat (*fonction)( TypeArgument ), unsigned int taille_maximale_element_cache = 100);
		/*
		 * \brief Surcharche del'operateur ()
		 * \fn TypeResultat operator()(TypeArgument arg);
		 */
		TypeResultat operator()(TypeArgument arg);
		/*
		 * \brief Methode permettant de lire le cache: ce qu'à sauvegarder la classe
		 * \fn EnsembleCouples<TypeArgument, TypeResultat> listerCache() const;
		 */
		EnsembleCouples<TypeArgument, TypeResultat> listerCache() const;
	private:
		TypeResultat (*m_fonction)( TypeArgument ); /*!< Pointeur sur la fonction passée en paramettre */
		TypeMemoireCache m_cache;
	};

}

#include "Memoizer.inl"

#endif /* MEMOIZER_H_ */
